﻿#define  _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

////我们写一个除法函数，我们在这个函数体中抛出异常（当被除数为0时，我们则抛出异常，否则我们就返回商）
////我们是在try块语句中抛异常的，在try块语句后面我们使用catch进行捕获的，我们catch的参数类型是int类型，我们后面就根据这个来进行匹配catch
//double Divide(int a, int b)
//{
//	try
//	{
//		// 当b == 0时抛出异常
//		if (b == 0)
//		{
//			string s("Divide by zero condition!");
//			throw s;
//		}
//		else
//		{
//			return ((double)a / (double)b);
//		}
//	}
//	catch (int errid)
//	{
//		cout << errid << endl;
//	}
//
//	return 0;
//}
//
//void Func()
//{
//	int* ptr1 = new int[10];
//	int* ptr2 = new int[10];
//
//	int len, time;
//	cin >> len >> time;
//	try {
//		cout << Divide(len, time) << endl;
//	}
//	catch (...)
//	{
//		delete[] ptr1;
//		cout << "delete:" << ptr1 << endl;
//
//		delete[] ptr2;
//		cout << "delete:" << ptr2 << endl;
//
//		// 重新抛出
//		throw;
//	}
//
//	delete[] ptr1;
//	cout << "delete:" << ptr1 << endl;
//
//	delete[] ptr2;
//	cout << "delete:" << ptr2 << endl;
//}
//
//int main()
//{
//	while (1)
//	{
//		try
//		{
//			Func();
//		}
//		catch (const string& errmsg)
//		{
//			cout << errmsg << endl;
//		}
//		catch (...)
//		{
//			cout << "未知异常" << endl;
//		}
//	}
//
//
//	return 0;
//}


//#include<thread>
//
//class Exception
//{
//public:
//	Exception(const string& errmsg, int id)
//		:_errmsg(errmsg)
//		, _id(id)
//	{}
//
//	virtual string what() const
//	{
//		return _errmsg;
//	}
//
//	int getid() const
//	{
//		return _id;
//	}
//protected:
//	string _errmsg;
//	int _id;
//};
//
//class SqlException : public Exception
//{
//public:
//	SqlException(const string& errmsg, int id, const string& sql)
//		:Exception(errmsg, id)
//		, _sql(sql)
//	{}
//
//	virtual string what() const
//	{
//		string str = "SqlException:";
//		str += _errmsg;
//		str += "->";
//		str += _sql;
//		return str;
//	}
//private:
//	const string _sql;
//};
//
//class CacheException : public Exception
//{
//public:
//	CacheException(const string& errmsg, int id)
//		:Exception(errmsg, id)
//	{}
//
//	virtual string what() const
//	{
//		string str = "CacheException:";
//		str += _errmsg;
//		return str;
//	}
//};
//
//class HttpException : public Exception
//{
//public:
//	HttpException(const string& errmsg, int id, const string& type)
//		:Exception(errmsg, id)
//		, _type(type)
//	{}
//
//	virtual string what() const
//	{
//		string str = "HttpException:";
//		str += _type;
//		str += ":";
//		str += _errmsg;
//		return str;
//	}
//private:
//	const string _type;
//};
//
//void SQLMgr()
//{
//	if (rand() % 7 == 0)
//	{
//		throw SqlException("权限不足", 100, "select * from name = '张三'");
//	}
//	else
//	{
//		cout << "SQLMgr 调用成功" << endl;
//	}
//}
//
//void CacheMgr()
//{
//	if (rand() % 5 == 0)
//	{
//		throw CacheException("权限不足", 100);
//	}
//	else if (rand() % 6 == 0)
//	{
//		throw CacheException("数据不存在", 101);
//	}
//	else
//	{
//		cout << "CacheMgr 调用成功" << endl;
//	}
//	SQLMgr();
//}
//
//void HttpServer()
//{
//	if (rand() % 3 == 0)
//	{
//		throw HttpException("请求资源不存在", 100, "get");
//	}
//	else if (rand() % 4 == 0)
//	{
//		throw HttpException("权限不足", 101, "post");
//	}
//	else
//	{
//		cout << "HttpServer调用成功" << endl;
//	}
//
//	CacheMgr();
//}
//
//int main()
//{
//	srand(time(0));
//	while (1)
//	{
//		this_thread::sleep_for(chrono::seconds(1));
//
//		try
//		{
//			HttpServer();
//		}
//		catch (const Exception& e) // 这里捕获基类，基类对象和派生类对象都可以被捕获
//		{
//			// 多态
//			cout << e.what() << endl;
//		}
//		catch (...)
//		{
//			cout << "Unkown Exception" << endl;
//		}
//	}
//	return 0;
//}



double Divide(int a, int b)
{
	try
	{
		// 当b == 0时抛出异常
		if (b == 0)
		{
			string s("Divide by zero condition!");
			throw s;
		}
		else
		{
			return ((double)a / (double)b);
		}
	}
	catch (int errid)
	{
		cout << errid << endl;
	}

	return 0;
}

void Func()
{
	int* ptr1 = new int[10];
	int* ptr2 = new int[10];

	int len, time;
	cin >> len >> time;
	try {
		cout << Divide(len, time) << endl;
	}
	catch (...)
	{
		delete[] ptr1;
		cout << "delete:" << ptr1 << endl;

		delete[] ptr2;
		cout << "delete:" << ptr2 << endl;

		// 重新抛出
		throw;
	}

	delete[] ptr1;
	cout << "delete:" << ptr1 << endl;

	delete[] ptr2;
	cout << "delete:" << ptr2 << endl;
}

int main()
{
	while (1)
	{
		try
		{
			Func();
		}
		catch (const string& errmsg)
		{
			cout << errmsg << endl;
		}
		catch (...)
		{
			cout << "未知异常" << endl;
		}
	}


	return 0;
}